package com.jie.other.jetpack.viewmodel

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.blankj.utilcode.util.Utils
import com.jie.other.jetpack.room.AppDataBase
import com.jie.other.jetpack.room.UserBean
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.launch
import kotlin.random.Random

class RoomViewModel : ViewModel() {

    /**
     * 用于切换数据来源
     * 0：查询所有用户
     * 1：查询首个用户
     * 2：查询名称包含某字符的用户
     */
    private val mDataForm = MutableStateFlow(0)

    /**
     * 获取当前展示的列表数据
     */
    fun getUserList() : Flow<List<UserBean>?> {
        return mDataForm.flatMapLatest {
            when(it) {
                1 -> {
                    // 查询首个用户
                    val firstUser = getUserDao().getFirstUser()
                    flowOf<List<UserBean>?>(ArrayList<UserBean>().apply {
                        firstUser?.run { add(this) }
                    })
                }
                // 查询名称包含某字符的用户
                2 -> getUserDao().getUserListByName("%1%")
                // 查询所有用户
                else -> getUserDao().getAll()
            }
        }
    }

    /**
     * 插入一个随机用户
     */
    fun insertUser() {
        viewModelScope.launch {
            getUserDao().run {
                val index = Random.nextInt(100)
                insert(UserBean(name = "name$index", age = "age$index").apply {
                    headPhoto = "headPhoto$index.jpg"
                })
            }
            // 切换为所有用户数据
            getAllUser()
        }
    }

    /**
     * 更新首个用户的年龄信息
     */
    fun updateUser() {
        viewModelScope.launch {
            getUserDao().run {
                getFirstUser()?.run {
                    age += 1
                    update(this)
                }
            }
            // 切换为所有用户数据
            getAllUser()
        }
    }

    /**
     * 切换列表数据来源为：首个用户
     */
    fun queryUserById() {
        mDataForm.value = 1
    }

    /**
     * 切换列表数据来源为：查询名称包含某字符的用户
     */
    fun queryUserByName() {
        mDataForm.value = 2
    }

    /**
     * 切换列表数据来源为：所有用户
     */
    fun getAllUser() {
        mDataForm.value = 0
    }

    /**
     * 删除所有用户
     */
    fun deleteAll() {
        viewModelScope.launch {
            getUserDao().run {
                deleteAll()
            }
            // 切换为所有用户数据
            getAllUser()
        }
    }

    /**
     * 获取数据库操作对象
     */
    private fun getUserDao() = AppDataBase.getDataBase(Utils.getApp()).getUserDao()

}